package com.atguigu.gulimail.product.service.impl;

import com.atguigu.gulimail.product.entity.AttrEntity;
import com.atguigu.gulimail.product.service.AttrService;
import com.atguigu.gulimail.product.vo.AttrGroupWithAttrsVo;
import com.atguigu.gulimail.product.vo.AttrVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.common.utils.PageUtils;
import com.atguigu.common.utils.Query;

import com.atguigu.gulimail.product.dao.AttrGroupDao;
import com.atguigu.gulimail.product.entity.AttrGroupEntity;
import com.atguigu.gulimail.product.service.AttrGroupService;
import org.springframework.util.StringUtils;


@Service("attrGroupService")
public class AttrGroupServiceImpl extends ServiceImpl<AttrGroupDao, AttrGroupEntity> implements AttrGroupService {


    @Autowired
    AttrService attrService;
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<AttrGroupEntity> page = this.page(
                new Query<AttrGroupEntity>().getPage(params),
                new QueryWrapper<AttrGroupEntity>()
        );

        return new PageUtils(page);
    }

    //根据商品分类id进行分页查询
    @Override
    public PageUtils queryPage(Map<String, Object> params, Long catelogId) {

        //无论是不是模糊查询还是按照0查询 就都需要模糊查询
        //如果有三级分类的id,就可以进行查询
        //select  *  from  pms_attr_group  where  catelog_id = ? and (attr_group_id=key  or  attr_group_name  like  %key%)
        //1获取从封装分页的参数params对象获取key  key表示前端获取到输入的检索条件
        String key  =(String)params.get("key");
        //创建查询条件  QueryWrapper对象可以用来进行构造条件 查询条件 3个
        //catelog_id = ? 构造第一个条件， 根据商品分类id进行查询
        QueryWrapper<AttrGroupEntity> wrapper = new QueryWrapper<AttrGroupEntity>();
        //and (attr_group_id=key  or  attr_group_name  like  %key%) 构造第二个条件，进行判断如果key不为空，进行检索条件进行构造
        //and方法后面是一个括号，使用函数表达式里面构造括号里面的条件
        if(!StringUtils.isEmpty(key)){
            wrapper.and((obj)->{
                //函数表达式的参数进行调用and()和or()进行构造  like方法已经左右添加%,进行模糊查询， 里面两个方法，只填左边%方法likeLeft()，只填右边的%方法likeRight()
                obj.eq("attr_group_id",key).or().like("attr_group_name",key);
            });
        }

        //第一个参数获取分页参数所有信息，第二个参数获取查询信息
        //如果三级分类id为0 查询所有的商品属性分组
        if(catelogId == 0){
            IPage<AttrGroupEntity> page = this.page(new Query<AttrGroupEntity>().getPage(params), wrapper);
            //使用封装好的PageUtils工具类，传递Ipage对象，把分页数据信息封装传递给对象PageUtils
            return  new PageUtils(page);
        }else {
            //有商品分类id就进行拼接这个eq条件
            wrapper.eq("catelog_id",catelogId);

            //构造条件作为参数进行添加进去 第一个参数封装的分页查询参数
            IPage<AttrGroupEntity>  page = this.page(new Query<AttrGroupEntity>().getPage(params),wrapper);
            return new PageUtils(page);
        }
    }
//三级分类下地所有属性分组和所有属性
    @Override
    public List<AttrGroupWithAttrsVo> getAttrGroupWithAttrsByCatelogId(Long catelogId) {
        //1根据商品分类id 在商品分组属性表中进行按照条件查询获取三级分类id所有属性分组实体
        List<AttrGroupEntity> groupEntities = this.list(new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId));
        //2查询到地属性分组进行流式处理
        List<AttrGroupWithAttrsVo> collect = groupEntities.stream().map((item) -> {
            //2.1创建一个前端返回地视图对象（所有属性分组和所欲属性数据）
            AttrGroupWithAttrsVo groupWithAttrsVo = new AttrGroupWithAttrsVo();
            //2.2使用BeanUtils工具类进行属性分组实体所有属性赋值给vo对象
            BeanUtils.copyProperties(item, groupWithAttrsVo);
            //2.3属性表中根据 根据关联分组id 找到属性分组id对应地所有属性
            List<AttrEntity> attrEntityList = attrService.getRelationAttr(groupWithAttrsVo.getAttrGroupId());
            //2.4返回视图vo对象， 组装成list容器
            groupWithAttrsVo.setAttrs(attrEntityList);
            return groupWithAttrsVo;
        }).collect(Collectors.toList());

        return collect;
    }


}